﻿// 602 [CF 1385D] a-Good String.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/978

给你一个长度为 n的由小写字母组成的字符串 s，保证 n=2k，其中 k为大于等于零的整数。
一个非空字符串 s被称为 c-good（c为 a...z中的某个字母）的，需要满足下列三个条件之一：

s长度为 1，且只含有 c字符；

s长度大于 1，且 s的前一半全为字符 c，
后一半为 next(c)-good的字符串，其中 next(c)表示 c后面的那一个字母；

s长度大于 1，且 s的前一半为 next(c)-good的字符串，后一半全为字符 c；

例如 aabc 是 a-good的，ffgheeee 是 e-good的。

对于给定的字符串 s，请求出最少改变 s中几个字符可以把它变成 a-good的字符串。

输入格式
输入有多组询问。

第一行一个整数 T 表示数据组数。

对于每组数据包含两行，第一行一个整数 n，第二行一个长度为 n的字符串 s。

输出格式
对于每组数据，输出一行一个整数表示答案。

样例输入
5
8
bbdcaaaa
8
asdfghjk
8
ceaaaabb
8
bbaaddcc
1
z



1
8
ffgheeee

样例输出
0
7
4
5
1
数据规模
对于 100%的数据，保证 1≤T≤5,1≤n≤131072
，保证 n=2k，其中 k为大于等于零的整数。
*/


#include <iostream>
#include <string>


using namespace std;

int n, T;
string str;


int calc(int l, int r, char x) {
	if (l == r) {
		if (str[l] == x) {
			return 0;
		}
		return 1;
	}

	int m = (l + r) >> 1;

	int res1 = calc(l, m, x + 1);
	int res2 = calc(m + 1, r, x + 1);

	for (int i = l; i <= m; i++) {
		if (str[i] != x) {
			res2++;
		}
	}

	for (int i = m + 1; i <= r; i++) {
		if (str[i] != x) {
			res1++;
		}
	}

	return min(res1,res2);
}


void solve() {
	cin >> n >> str;

	cout << calc(0, n - 1, 'a') << endl;

	return;
}

int main()
{
	cin >> T;
	while (T--) {
		solve();
	}
 

	return 0;
}

 